package com.linkai.多线程._04_Lamda;

/**
 * @Description: Lambda 表达式（带参数）
 *              https://blog.csdn.net/jiankunking/article/details/79825928
 *               总结：
 *                  （1）Lambda 表达式只能有一行代码的情况下才能简化成为1行，
 *                      如果有多行，则必须要用代码块包括
 *                  （2）必须是函数式接口
 *                  （3）多个参数也可以去掉参数类型，要去掉就都去掉，必须加上括号
*               应用：
 *                   Runnable接口里面就只有一个方法，属于函数式接口，可以使用 Lambda 表达式
 *              Lambda表达式原理：
 *                  （1）在类编译时，会生成一个私有静态方法+一个内部类
 *                  （2）在内部类中实现了函数式接口，在实现接口的方法中，会调用编译器生成的静态方法；
 *                  （3）在使用lambda表达式的地方，通过传递内部类实例，来调用函数式接口方法。
 * @Author: 林凯
 * @Date: 2021/10/19 19:22
 */
public class TestLambda2 {

    // 2. 静态内部类
    static class Love2 implements MyLove {

        @Override
        public void love(int a) {
            System.out.println("I love you " + a + " times");
        }
    }

    public static void main(String[] args) {
        MyLove myLove = new Love();
        myLove.love(1);

        myLove = new Love2();
        myLove.love(2);

        new Thread(()->{

        }).start();

        // 3. 局部内部类
        class Love3 implements MyLove {
            @Override
            public void love(int a) {
                System.out.println("I love you " + a + " times");
            }
        }
        myLove = new Love3();
        myLove.love(3);

        // 4. 匿名内部类
        myLove = new MyLove() {
            @Override
            public void love(int a) {
                System.out.println("I love you " + a + " times");
            }
        };
        myLove.love(4);

        // 5. 匿名内部类进一步进行简化，形成 lambda 表达式
        myLove = (int a)->{
            System.out.println("I love you " + a + " times");
        };
        myLove.love(5);

        // 5.1 简化1：去掉参数类型
        myLove = (a)->{
            System.out.println("I love you " + a + " times");
        };
        myLove.love(6);

        // 5.2 简化2：去掉括号
        myLove = a->{
            System.out.println("I love you " + a + " times");
        };
        myLove.love(7);

        // 5.3 简化3：去掉花括号
        myLove = a->System.out.println("I love you " + a + " times");
        myLove.love(8);


    }
}

interface MyLove{
    void love(int a);
}

// 1. 普通的外部类
class Love implements MyLove {

    @Override
    public void love(int a) {
        System.out.println("I love you " + a + " times");
    }
}
